package com.jl.magic.extract;


import com.jl.magic.images.PixelTools;

import java.awt.image.BufferedImage;

/**
 * @author jiangli
 * 主题色提取
 */
public class ColorExtract {

    /**
     * 像素提取质量，>=1；
     * 值越小，提取主题色越精确，性能低；
     * 相反值越大，主题色差异越大，性能高
     */
    private static final int DEFAULT_QUALITY = 10;

    /**
     * 获取主题色
     *
     * @param sourceImage 图片文件
     * @return 主色调RGB数组
     */
    public static int[] getThemeColor(BufferedImage sourceImage) {
        return getThemeColor(sourceImage, false);
    }

    /**
     * 获取主题色
     *
     * @param sourceImage 图片文件
     * @param ignoreWhite 是否忽略白色
     * @return 主色调RGB数组
     */
    public static int[] getThemeColor(BufferedImage sourceImage, boolean ignoreWhite) {
        return getThemeColor(sourceImage, DEFAULT_QUALITY, ignoreWhite);
    }

    /**
     * 获取主题色
     *
     * @param sourceImage 图片文件
     * @param quality     质量
     * @param ignoreWhite 是否忽略白色
     * @return 主色调RGB数组
     */
    public static int[] getThemeColor(BufferedImage sourceImage, int quality, boolean ignoreWhite) {
        int[][] palette = getPalette(sourceImage, 1, quality, ignoreWhite);
        if (palette != null && palette.length > 0) {
            return palette[0];
        }
        return null;
    }

    /**
     * 获取主题色
     *
     * @param sourceImage 图片文件
     * @param maxColors   主色调个数
     * @param quality     提取质量
     * @param ignoreWhite 是否忽略白色
     * @return 主色调数组
     */
    public static int[][] getPalette(BufferedImage sourceImage, int maxColors, int quality, boolean ignoreWhite) {
        return getColorMap(sourceImage, maxColors, quality, ignoreWhite).palette();
    }

    /**
     * 获取主题色map对象
     *
     * @param sourceImage 图片文件
     * @param colorCount  提取的主题色个数
     * @param quality     质量，即提取像素跨度
     * @param ignoreWhite 是否忽略白色
     * @return 像素立方map对象
     */
    public static ColorMap getColorMap(BufferedImage sourceImage, int colorCount, int quality, boolean ignoreWhite) {
        int maxColorCount = 10;
        if (colorCount < 1 || colorCount > maxColorCount) {
            throw new IllegalArgumentException("主题色的个数应该在 1 ~ 10 个数之间.");
        }
        if (quality < 1) {
            throw new IllegalArgumentException("质量(quality)不能小于1.");
        }

        //获取像素点
        int[][] pixels;
        switch (sourceImage.getType()) {
            case BufferedImage.TYPE_3BYTE_BGR:
            case BufferedImage.TYPE_4BYTE_ABGR:
                pixels = PixelTools.getPixelsFast(sourceImage, quality, ignoreWhite);
                break;
            default:
                pixels = PixelTools.getPixelsSlow(sourceImage, quality, ignoreWhite);
                break;
        }

        return MMCQ.quantize(pixels, colorCount);
    }

}
